package com.smart.community.commons.websocket;

import java.util.List;
import java.util.Set;
import com.smart.community.commons.websocket.UserWebSocketSession;

/**
 * WebSocket服务接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
public interface WebSocketService {

    /**
     * 发送消息到指定用户
     * 
     * @param userId 用户ID
     * @param message 消息
     * @return 是否发送成功
     */
    boolean sendToUser(Long userId, WebSocketMessage message);

    /**
     * 发送消息到指定房间
     * 
     * @param roomId 房间ID
     * @param message 消息
     * @return 发送成功的用户数量
     */
    int sendToRoom(String roomId, WebSocketMessage message);

    /**
     * 广播消息到所有在线用户
     * 
     * @param message 消息
     * @return 发送成功的用户数量
     */
    int broadcast(WebSocketMessage message);

    /**
     * 广播消息到指定物业公司的所有用户
     * 
     * @param propertyCompanyId 物业公司ID
     * @param message 消息
     * @return 发送成功的用户数量
     */
    int broadcastToPropertyCompany(Long propertyCompanyId, WebSocketMessage message);

    /**
     * 获取在线用户列表
     * 
     * @return 在线用户会话列表
     */
    List<UserWebSocketSession> getOnlineUsers();

    /**
     * 获取指定房间的在线用户
     * 
     * @param roomId 房间ID
     * @return 房间内的在线用户会话列表
     */
    List<UserWebSocketSession> getRoomUsers(String roomId);

    /**
     * 获取指定物业公司的在线用户
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 物业公司的在线用户会话列表
     */
    List<UserWebSocketSession> getPropertyCompanyUsers(Long propertyCompanyId);

    /**
     * 检查用户是否在线
     * 
     * @param userId 用户ID
     * @return 是否在线
     */
    boolean isUserOnline(Long userId);

    /**
     * 获取用户会话信息
     * 
     * @param userId 用户ID
     * @return 用户会话信息
     */
    UserWebSocketSession getUserSession(Long userId);

    /**
     * 创建房间
     * 
     * @param roomId 房间ID
     * @param roomName 房间名称
     * @param description 房间描述
     * @return 是否创建成功
     */
    boolean createRoom(String roomId, String roomName, String description);

    /**
     * 删除房间
     * 
     * @param roomId 房间ID
     * @return 是否删除成功
     */
    boolean deleteRoom(String roomId);

    /**
     * 获取房间列表
     * 
     * @return 房间ID集合
     */
    Set<String> getRoomList();

    /**
     * 用户加入房间
     * 
     * @param userId 用户ID
     * @param roomId 房间ID
     * @return 是否加入成功
     */
    boolean joinRoom(Long userId, String roomId);

    /**
     * 用户离开房间
     * 
     * @param userId 用户ID
     * @param roomId 房间ID
     * @return 是否离开成功
     */
    boolean leaveRoom(Long userId, String roomId);

    /**
     * 清理过期会话
     * 
     * @return 清理的会话数量
     */
    int cleanupExpiredSessions();

    /**
     * 获取在线用户数量
     * 
     * @return 在线用户数量
     */
    int getOnlineUserCount();

    /**
     * 获取房间用户数量
     * 
     * @param roomId 房间ID
     * @return 房间用户数量
     */
    int getRoomUserCount(String roomId);

    /**
     * 获取物业公司在线用户数量
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 物业公司在线用户数量
     */
    int getPropertyCompanyUserCount(Long propertyCompanyId);
}
